package com.zyg.mq;

import com.zyg.config.RabbitMQConfig;
import com.zyg.pojo.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import com.rabbitmq.client.Channel;

import java.io.IOException;
import java.util.Map;

@Slf4j
@Component
@RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = RabbitMQConfig.TOPIC_ZYG_DATA_MSG,durable = "true"),
        exchange = @Exchange(name=RabbitMQConfig.EXCHANGE_ZYG_DATA_MSG,durable = "true",type = "topic"),
        key = "exchange.zyg.*"))
public class ZygMsgReceive {

    @RabbitHandler
    public void process(@Payload SysUser message, @Headers Map<String,Object> headers, Channel channel) throws IOException {

        /**
         * Delivery Tag 用来标识信道中投递的消息。RabbitMQ 推送消息给 Consumer 时，会附带一个 Delivery Tag，
         * 以便 Consumer 可以在消息确认时告诉 RabbitMQ 到底是哪条消息被确认了。
         * RabbitMQ 保证在每个信道中，每条消息的 Delivery Tag 从 1 开始递增。
         */
        Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);

        /**
         *  multiple 取值为 false 时，表示通知 RabbitMQ 当前消息被确认
         *  如果为 true，则额外将比第一个参数指定的 delivery tag 小的消息一并确认
         */
        boolean multiple = false;

        /**
         * 处理消息
         */

        log.info("处理消息："+message);

        channel.basicAck(deliveryTag,multiple);//报错不管他
        /**
         * ACK,确认一条消息已经被消费
         */
        /*if(success){
            channel.basicAck(deliveryTag,multiple);
        }*/
    }

    @RabbitHandler
    public void process(@Payload String message, @Headers Map<String,Object> headers, Channel channel) throws IOException {

        /**
         * Delivery Tag 用来标识信道中投递的消息。RabbitMQ 推送消息给 Consumer 时，会附带一个 Delivery Tag，
         * 以便 Consumer 可以在消息确认时告诉 RabbitMQ 到底是哪条消息被确认了。
         * RabbitMQ 保证在每个信道中，每条消息的 Delivery Tag 从 1 开始递增。
         */
        Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);

        /**
         *  multiple 取值为 false 时，表示通知 RabbitMQ 当前消息被确认
         *  如果为 true，则额外将比第一个参数指定的 delivery tag 小的消息一并确认
         */
        boolean multiple = false;

        /**
         * 处理消息
         */

        log.info("处理消息："+message);

        channel.basicAck(deliveryTag,multiple);//报错不管他
        /**
         * ACK,确认一条消息已经被消费
         */
        /*if(success){
            channel.basicAck(deliveryTag,multiple);
        }*/
    }
}
